#pragma once

#include <iostream>
#include <string>
#include <unordered_map>
#include "TcpServer.hpp"
#include "HttpProtocol.hpp"

using namespace TcpServerModule;

using http_handler_t = std::function<void (HttpRequest &, HttpResponse &)>;

class HttpServer
{
public:
    HttpServer(int port)
        : _tsvr(std::make_unique<TcpServer>(port))
    {
    }
    void Resgiter(std::string funcname, http_handler_t func)
    {
        _route[funcname] = func;
    }
    bool SafeCheck(const std::string &service) // 安全检查
    {
        auto iter = _route.find(service);
        return iter != _route.end();
    }
    void Start()
    {
        _tsvr->InitServer([this](SockPtr sockfd, InetAddr client){ 
            return this->HandlerHttpRequest(sockfd, client); 
        });
        _tsvr->Loop();
    }
    // 就是我们处理http的入口
    bool HandlerHttpRequest(SockPtr sockfd, InetAddr client)
    {
        LOG(LogLevel::DEBUG) << "HttpServer: get a new client: " << sockfd->Fd() << " addr info: " << client.Addr();
        std::string http_request;
        sockfd->Recv(&http_request); // 在 Http 这里暂时不做报文完整性处理
        HttpRequest req;
        req.Deserialize(http_request); // 反序列化
        HttpResponse resp; 
        
        // 请求被分成两类： 1. 请求一般的静态资源  
        if(req.IsHasArgs()) // 判定是否带参
        {
            std::cout << "-----IsHasArgs()" << std::endl;
            // 2. 提交参数、携带参数，进行交互性设置
            std::string service = req.Path();
            if(SafeCheck(service))  
                _route[req.Path()](req, resp); // /login 回调注册方法
            else resp.Build(req); // Debug -> 走到 404 
        }

        else{
            std::cout << "-----Non IsHasArgs()" << std::endl;
            resp.Build(req); // 构建应答    
        }
        std::string resp_str; 
        resp.Serialize(&resp_str); // 序列化
        sockfd->Send(resp_str); // 发送
        return true;

        // req.Print();
        // std::cout << "用户想要： " << req.Uri() << std::endl;
        // req.GetContent(); // 得到文件内容

        // std::cout << http_request; //字节流的请求
        // // 读取请求，对请求进行分析处理 --> 文本处理！
        // // 1. 读取请求的完整性 --- 暂时先不管这个
        // // 2. 完整 http 进行反序列化，http response 做序列化...
        // // Demo 1 : 直接返回一个固定的内容
        // std::string status_line = "HTTP/1.1 200 OK" + Sep + BlankLine; // 现在主流http 协议用的是 http/1.1

        // // 直接返回一个html网页
        // std::string body = "<!DOCTYPE html>\
        //                     <html>\
        //                    <head>\
        //                    <meta charset = \"UTF-8\">\
        //                    <title> Hello World</title>\
        //                    </head>\
        //                    <body>\
        //                    <p> Hello World</p>\
        //                    </body> </html>";
        
        // std::string http_response = status_line + body;
        // sockfd->Send(http_response);
        
        // return true;
    }
    
    ~HttpServer() {}

private:
    std::unique_ptr<TcpServer> _tsvr;
    std::unordered_map<std::string, http_handler_t> _route; // 功能路由
};